# 配置文件
import os
import logging
import logging.config

# [1]配置路径
folder_list = []
# 根路径|D:\\Files\\Python\\ATM+Shoppings
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
# D:\\Files\\Python\\ATM+Shoppings\\db
DB_DIR = os.path.join(BASE_DIR, 'db')
# D:\\Files\\Python\\ATM+Shoppings\\log
LOG_DIR = os.path.join(BASE_DIR, 'log')

# 用户的信息文件
# D:\\Files\\Python\\ATM+Shoppings\\db\\info
USER_INFO_DIR = os.path.join(DB_DIR, 'info')
# D:\\Files\\Python\\ATM+Shoppings\\log\\User
USER_LOG_DIR = os.path.join(LOG_DIR, 'User')
# D:\\Files\\Python\\ATM+Shoppings\\log\\Product
PRODUCT_LOG_DIR = os.path.join(LOG_DIR, 'Product')
ADMIN_LOG_DIR = os.path.join(LOG_DIR, 'Admin')

# 商品信息
PRODUCT_DIR = os.path.join(DB_DIR, 'product')

# 将路径添加至文件夹列表中
folder_list.append(BASE_DIR)
folder_list.append(DB_DIR)
folder_list.append(LOG_DIR)
folder_list.append(USER_INFO_DIR)
folder_list.append(USER_LOG_DIR)
folder_list.append(PRODUCT_LOG_DIR)
folder_list.append(ADMIN_LOG_DIR)
folder_list.append(PRODUCT_DIR)


def creat_folder(*args):
    for path in args:
        if not os.path.exists(path):
            os.mkdir(path)
            print(f"所需文件{os.path.basename(path)}>>>创建成功")


# [2] 配置日志

# 自定义日志级别
CONSOLE_LOG_LEVEL = "INFO"
FILE_LOG_LEVEL = "DEBUG"

# 自定义日志格式
STANDARD_FORMAT = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d][%(levelname)s][%(message)s]'
SIMPLE_FORMAT = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

# 日志配置字典
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': STANDARD_FORMAT,
            'datefmt': '%Y-%m-%d %H:%M:%S'  # 时间戳格式
        },
        'simple': {
            'format': SIMPLE_FORMAT
        },
    },
    # 过滤器
    'filters': {},
    # 日志处理器
    'handlers': {
        # 自定义处理器名称 - 输出到控制台屏幕
        'console': {
            'level': CONSOLE_LOG_LEVEL,
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        # 自定义处理器名称 - 输出到文件
        'default': {
            'level': FILE_LOG_LEVEL,
            'class': 'logging.handlers.RotatingFileHandler',
            'formatter': 'standard',
            # 这里 要注意声明配置文件输出端的文件路径
            'filename': '',
            # 限制文件大小：1024 * 1024 * 5 = 5242880，意味着这个变量的值是 5MB（兆字节）
            'maxBytes': 1024 * 1024 * 5,
            'backupCount': 5,
            # 日志存储文件格式
            'encoding': 'utf-8',
        },
    },
    # 日志记录器，用于记录应用程序的运行状态和错误信息。
    'loggers': {
        # 空字符串作为键 能够兼容所有的日志(当没有找到对应的日志记录器时默认使用此配置)
        # 默认日志配置
        '': {
            # 日志处理器 类型：打印到控制台输出 + 写入本地日志文件
            'handlers': ['default'],
            # 日志等级 ： DEBUG
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}


def creat_log_path(tag, username):
    path = ''
    if tag == 'user':
        if username == '':
            path = os.path.join(USER_LOG_DIR, f"other_log.log")
        else:
            path = os.path.join(USER_LOG_DIR, f"{username}_log.log")
    elif tag == 'product':
        path = os.path.join(PRODUCT_LOG_DIR, "product_log.log")
    elif tag == 'admin':
        path = os.path.join(ADMIN_LOG_DIR, "admin_log.log")
    return path


def get_logger(tag, username, name=''):
    path = creat_log_path(tag, username)
    LOGGING_DIC['handlers']['default']['filename'] = path
    # 初始化日志处理器 - 使用配置字典初始化日志处理器(将自定义配置加载到日志处理器中)
    logging.config.dictConfig(LOGGING_DIC)
    # 实例化日志处理器对象 - 并赋予日志处理器等级
    logger = logging.getLogger(name)
    # 以下是输出至控制台
    # if 'console' not in [handler.name for handler in logger.handlers]:
    #     console_handler = logging.StreamHandler()
    #     console_handler.setLevel(CONSOLE_LOG_LEVEL)
    #     console_handler.setFormatter(logging.Formatter(SIMPLE_FORMAT))
    #     logger.addHandler(console_handler)
    # 返回日志生成对象
    return logger
